/****************************************************************************
**
** Copyright (C) 2011 Jesús Martínez Pérez
**
** This program is free software: you can redistribute it and/or modify it
** under the terms of the GNU General Public License as published by the 
** Free Software Foundation, either version 3 of the License, or (at your
** option) any later version.
**
** This program is distributed in the hope that it will be useful, but 
** WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
** or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
** for more details.
**
** You should have received a copy of the GNU General Public License along 
** with this program. If not, see <http://www.gnu.org/licenses/>
**
****************************************************************************/
/*
 * vd_unsignedchar.h
 *
 *		Created on: 22/05/2010
 *		Author: Jesús Martínez Pérez
 */
#ifndef _VDCH_H_
#define _VDCH_H_
#define MAX 10
#include <iostream>
using namespace std;
/**
 * \class VD_unsignedchar
 *
 *
 * \brief Esta clase hace posible el uso de un vector dinamico de unsigned char
 *         
 *
 * \author Jesús Martínez Pérez 
 *
 *
 * \date $Date: 22/05/2010 $
 *
 */
class VD_unsignedchar{
	private:
		int r;
		int n;
		unsigned char *v;
		void Ampliar();
	public:
/**
	@brief Constructor por defecto
*/
		VD_unsignedchar();
/**
	@brief Constructor por parámetro
	@param[in] tam El tamaño del vector que vamos a construir
*/
		VD_unsignedchar(int tam);
/**
@brief Constructor de copia
*/
		VD_unsignedchar(const VD_unsignedchar &V);
/**
@brief Destructor
*/
		~VD_unsignedchar();
/**
@brief Operador de asignación
@return Un vector dinámico de char en el que realiza la asignación
*/
		VD_unsignedchar &operator=(const VD_unsignedchar &V);
/**
@brief Consultar el numero de elementos del vector dinámico de unsigned char
@return Un valor entero que indica el numero de elementos
*/
		int Size()const;
/**
@brief Añadir un valor unsigned char al vector dinámico de unsigned char
@param[in] a El valor unsigned char que queremos añadir al vector
*/
		void Add(unsigned char a);
/**
@brief Consultar el valor al que pertenece una posición en el vector
@param[in] i La posición que queremos consultar
@return El valor unsigned char en el vector que tiene la posición indicada
*/
		unsigned char Get(int i)const;
/**
@brief Modificar el valor del unsigned char que pertenece a una posición en el vector indicada
@param[in] i La posición que queremos modificar
@param[in] v El valor unsigned char que queremos asignar a esa posición
*/
		void Set(int i, unsigned char v);
/**
@brief Borrar el elemento del vector de unsigned char que hay en una posición indicada
@param[in] pos La posición del elemento que queremos eliminar
*/
		void Borrar(int pos);
/**
@brief Sobrecarga del operador de igualdad
@return True si son iguales, False si no son iguales
*/
		bool operator==(VD_unsignedchar &vd);
/**
@brief Sobrecarga del operador de desigualdad
@return False si son iguales, True si no son iguales
*/
		bool operator!=(VD_unsignedchar &vd);
/** 
@brief Añade un valor unsigned char al final de un vector de unsigned char
@param[in] a El valor unsigned char que queremos añadir 
*/
		VD_unsignedchar operator+(unsigned char a);
/** 
@brief Concatena un vector dinamico de unsigned char final del vector dinamico de unsigned char que tenemos
*/
		VD_unsignedchar operator+(VD_unsignedchar &v);
/** 
@brief Sobrecarga del operador de consulta [] de una posición del vector dinámico de unsigned char
@param[in] i Un entero que indica la posicion del elemento del vector dinamico de unsigned char que vamos a consultar
@return El valor unsigned char del elemento que consultamos
*/
		unsigned char &operator[](int i);
/** 
@brief Añade un elemento al final de un vector
@param[in] a El valor unsigned char del elemento que queremos añadir 
@param[in] vd El vector dinámico de unsigned char al que le añadimos el elemento
*/		
		friend VD_unsignedchar operator+(unsigned char a,const VD_unsignedchar &vd);
/** 
@brief Sobrecarga del operador de salida
*/
		friend ostream & operator<<(ostream &os,const VD_unsignedchar &vd);
/** 
@brief Sobrecarga del operador de entrada
*/
		friend istream & operator>>(istream &is, VD_unsignedchar &vd);

};
#endif
